/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package isd.seguridad.web;

import isd.seguridad.dao.SG_EstadoDAO;
import isd.seguridad.dao.SG_UsuarioDAO;
import isd.seguridad.modelo.SG_Estado;
import isd.seguridad.modelo.SG_Usuario;
import isd.general.util.JsfUtil;
import java.io.IOException;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.model.menu.MenuItem;

/**
 *
 * @author Caio
 */
@ManagedBean(name = "usuarioSession")
@SessionScoped
public class UsuarioSession implements Serializable {

    @EJB
    private SG_UsuarioDAO usuarioDAO;
    @EJB
    private SG_EstadoDAO estadoDAO;
    boolean estaRegistrado;
    private SG_Usuario usuario;
    private List<MenuItem> menuUsuario;
    private int cantIntentos;
    private boolean muestroMensajeExpirado;

    @PostConstruct
    public void init() {
        setUsuario(new SG_Usuario());
        estaRegistrado = false;
        cantIntentos = 0;
    }

    public SG_Usuario getUsuario() {
        if (usuario == null) {
            usuario = new SG_Usuario();
        }
        return usuario;
    }

    public void checkLogin() throws IOException {
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        if (this.usuario.getUsuario() == null) {
            context.redirect("global/inicio.xhtml");
        }
    }

    public void setUsuario(SG_Usuario usuario) {
        this.usuario = usuario;
    }

    public List<MenuItem> getMenuUsuario() {
        return menuUsuario;
    }

    public void setMenuUsuario(List<MenuItem> menuUsuario) {
        this.menuUsuario = menuUsuario;
    }

    public boolean isEstaRegistrado() {
        return estaRegistrado;
    }

    public void setEstaRegistrado(boolean estaRegistrado) {
        this.estaRegistrado = estaRegistrado;
    }

    //----------------------------------------------------------------------
    public String login() {

        System.out.println("Login");
        //Sucursal sucursal = (Sucursal) JsfUtil.getObjeto("sucursalSession.sucursal",Sucursal.class);
        //obtenemos el usuario


        cantIntentos++;
        SG_Usuario usuAux = null;
        try {
            //usuAux = usuarioDAO.getUsuarioByEmail(usuario.getEmail());
            usuAux = usuarioDAO.getUsuarioByNombre(getUsuario().getUsuario());
        } catch (Exception e) {
            System.out.println("No se encontró usuario");
        }

        //Valida que exista el usuario
        if (usuAux == null) {
            JsfUtil.addErrorMessage("El usuario '" + getUsuario().getUsuario() + "' no se encuentra registrado");
            System.out.println("Usuario no registrado");
            return "";
        }

        if (cantIntentos == 5) {
            SG_Estado estado = estadoDAO.getEstado(2); //Bloqueado
            usuAux.setEstado(estado);
            try {
                usuarioDAO.editar(usuAux);
            } catch (Exception ex) {
                
            }
            JsfUtil.addErrorMessage("Ha superado la cantidad de intentos permitida, usuario bloqueado");
            return "";
        }

        //Valida que no se encuentre inactivo
        if (usuAux.getEstado().getDescripcion().equals("Inactivo")) {
            JsfUtil.addErrorMessage("El usuario '" + usuAux.getUsuario() + "' se encuentra " + usuAux.getEstado().getDescripcion());
            System.out.println("Usuario inactivo");
            return "";
        }

        //Valida que no se encuentre bloqueado
        if (usuAux.getEstado().getDescripcion().equals("Bloqueado")) {
            JsfUtil.addErrorMessage("El usuario '" + usuAux.getUsuario() + "' se encuentra " + usuAux.getEstado().getDescripcion());
            System.out.println("Usuario bloqueado");
            return "";
        }


        /**
        //obtenemos la sucursal seleccionada
        Sucursal sucSele = usuarioSucursalDAO.getSucursalByUsuario(sucursal.getId(), usuAux.getId());
        //Validamos la sucursal
        if (sucSele==null){
        JsfUtil.addErrorMessage("No tiene acceso a la sucursal "+ sucursal.getDescripcion());
        System.out.println("Usuario sin acceso a sucursal");
        return null;
        }
         */
        //Validamos la contraseña
        if (!usuario.getPassword().equals(usuAux.getPassword())) {
            JsfUtil.addErrorMessage("Password incorrecto");
            getUsuario().setPassword("");
            return "";
        }

        //Falta verificar el estado del usuario

        setUsuario(usuAux);
        estaRegistrado = true;
//        System.out.println("Usuario logeado: " + getUsuario().getUsuario());
        NavegadorMB navegador = (NavegadorMB) JsfUtil.getObjeto("navegadorMB", NavegadorMB.class);

        navegador.cargarMenu(usuario);

        switch (usuario.getTipo().getId()) {

            //Administrador
            case 1:
                return "../global/principal.xhtml";
            //Usuario 
            case 2:
                return "../global/principal.xhtml";
            
            default:
                return "../global/principal.xhtml";
        }
    }

    public String logout() {

        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        System.out.println("Usuario logout: " + getUsuario().getUsuario());
        session.invalidate();
        setUsuario(null);
        setUsuario(new SG_Usuario());
        estaRegistrado = false;
        return "../global/inicio.xhtml";
    }

    public void monitorearSesion() throws IOException {
        ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
        if (this.usuario.getUsuario() == null) {
            context.redirect("global/inicio.xhtml");
        }
        /**
        System.out.println("Sesión expirada " + new Date());
        invalidarSession();
        */
    }

    private void invalidarSession(){

        FacesContext context = javax.faces.context.FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        System.out.println("Usuario logout: " + usuario.getUsuario() + " Hora: " + new Date()  ) ;
        session.invalidate();
        usuario = null;
        usuario = new SG_Usuario();
        estaRegistrado = false;
        HttpSession sessionNew = (HttpSession) context.getExternalContext().getSession(true);
    }

    public boolean isMuestroMensajeExpirado() {
        return muestroMensajeExpirado;
    }

    public void setMuestroMensajeExpirado(boolean muestroMensajeExpirado) {
        this.muestroMensajeExpirado = muestroMensajeExpirado;
    }


     //_------------------------------------------------------------------------


    

}
